#!/usr/bin/env python3
"""
脚本名称：ch40_exe.py
功能描述： 演示模块、类、对象、异常、装饰器
作者：Gavin
创建日期：2022-05-06
版本：1.0
依赖库：无
使用方法： python ch40_exe.py
"""


class Person:
    # 类变量，所有Person实例共享
    population = 0

    def __init__(self, name, age):
        # 实例变量，每个Person实例都有自己独特的这些变量
        self.name = name
        self.age = age
        # 每当创建Person实例时，增加类变量population的值
        Person.population += 1

    def say_hello(self):
        # 实例方法，使用self调用实例的变量
        return f"Hello, my name is {self.name} and I am {self.age} years old."

    def celebrate_birthday(self):
        # 改变实例变量age的值
        self.age += 1
        return f"Happy birthday, {self.name}! You are now {self.age}."

    @classmethod
    def get_population(cls):
        # 类方法，使用cls调用类变量
        return cls.population

    @property
    def age(self):
        # 属性装饰器，提供age属性的getter方法
        return self._age

    @age.setter
    def age(self, age):
        # 属性装饰器，提供age属性的setter方法，可以添加额外的逻辑
        if age < 0:
            raise ValueError("Age cannot be negative")
        self._age = age

    @staticmethod
    def is_adult(age):
        # 静态方法，不依赖于类的实例或类本身
        return age >= 18


# 使用示例
person1 = Person("Alice", 30)
print(person1.say_hello())  # 输出: Hello, my name is Alice and I am 30 years old.
print(Person.get_population())  # 输出: 1

person1.celebrate_birthday()
print(person1.celebrate_birthday())  # 输出: Happy birthday, Alice! You are now 31.

try:
    person2 = Person("Bob", -5)
except ValueError as e:
    print(e)  # 输出: Age cannot be negative

print(Person.is_adult(16))  # 输出: False
